﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Web;
using Lcsoft.UrlRewriter.Configuration;
using Lcsoft.UrlRewriter.Utilities;

namespace Lcsoft.UrlRewriter
{
	/// <summary>
	/// 程序集 <see cref="Lcsoft.UrlRewriter"/> 的初始化模块。
	/// </summary>
	public class HttpModule : IHttpModule
	{
		/// <summary>
		/// 获取 <see cref="RewriterEngine"/> 对象的实例。
		/// </summary>
		public static RewriterEngine Rewriter
		{
			get { return new RewriterEngine(new HttpContextFacade(), RewriterConfiguration.Current); }
		}

		/// <summary>
		/// 获取地址重写配置信息。
		/// </summary>
		public static RewriterConfiguration Configuration
		{
			get { return RewriterConfiguration.Current; }
		}

		/// <summary>
		/// 获取当前请求包含的原始查询字符串。
		/// </summary>
		public static string OriginalQueryString
		{
			get { return Rewriter.OriginalQueryString; }
			set { Rewriter.OriginalQueryString = value; }
		}

		/// <summary>
		/// 获取当前请求被重写之后的查询字符串。
		/// </summary>
		public static string QueryString
		{
			get { return Rewriter.QueryString; }
			set { Rewriter.QueryString = value; }
		}

		/// <summary>
		/// 获取当前请求的原始地址。
		/// </summary>
		public static string RawUrl
		{
			get { return Rewriter.RawUrl; }
			set { Rewriter.RawUrl = value; }
		}

		/// <summary>
		/// 获取自定义配置信息提供程序的实例。
		/// </summary>
		public static RewriterConfigurationProvider ConfigurationProvider { get; private set; }

		#region IHttpModule Members

		/// <summary>
		/// 初始化模块，并使其为处理请求做好准备。
		/// </summary>
		/// <param name="context">一个 <see cref="HttpApplication"/>，它提供对 ASP.NET 应用程序内所有应用程序对象的公用的方法、属性和事件的访问。</param>
		public virtual void Init(HttpApplication context)
		{
			context.BeginRequest += this.BeginRequest;
			context.EndRequest += this.EndRequest;
		}

		/// <summary>
		/// 处置由实现 IHttpModule 的模块使用的资源（内存除外）。
		/// </summary>
		public virtual void Dispose() { }

		#endregion

		/// <summary>
		/// 解析地址信息。
		/// </summary>
		/// <param name="location">包含要解析的地址的 <see cref="System.String"/>。</param>
		/// <returns>返回包含解析之后的地址的 <see cref="System.String"/>。</returns>
		protected virtual string ResolveLocation(string location) { return Rewriter.ResolveLocation(location); }

		/// <summary>
		/// 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
		/// </summary>
		/// <param name="sender">事件源。</param>
		/// <param name="e">包含事件数据的 <see cref="EventArgs"/>。</param>
		protected virtual void BeginRequest(object sender, EventArgs e)
		{
			HttpContext.Current.Response.AddHeader(Constants.HeaderXPoweredBy, Configuration.XPoweredBy);

			Rewriter.Rewrite();
		}

		/// <summary>
		/// 在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生。
		/// </summary>
		/// <param name="sender">事件源。</param>
		/// <param name="e">包含事件数据的 <see cref="EventArgs"/>。</param>
		protected virtual void EndRequest(object sender, EventArgs e) { }

		/// <summary>
		/// 设置自定义配置信息提供程序。
		/// </summary>
		/// <param name="configurationProvider">自定义配置信息提供程序的实例。</param>
		protected void SetConfigurationProvider(RewriterConfigurationProvider configurationProvider) { ConfigurationProvider = configurationProvider; }
	}
}
